StupidNote
glibc2.31下的off-by-null,禁用了execve,并且加了点料
这里的off-by-null藏得很深,我也是在放出hint后才找到的

两个大功能:
add,delete
add限制了size <= 0x200
delete有两种释放堆块的方法,puts-free和edit-free;并且不是简单的调用free,而且通过对free_hook进行赋值为函数地址来实现,这种做法直接导致后面orw时无法通过free_hook结合setcontext来完成;

利用:
1、泄漏堆地址
2、利用off-by-null构造unlink实现overlap,注意glibc-2.31下对size,prev_size都有检测
3、在orw读取flag的时候因为不能用free_hook,所以只能重新找一个适合的地址;最后在exit中找到这样的汇编,所以只要控制了 rip + 0x1cba7 跟 rip + 0x1d1a1,就相当于调用任意函数并且控制了参数

上图的两个地址跟在不同环境还是有点差别的,在桌面版里面我是libc_base + 0x236968跟libc_base + 0x236f68;而在docker里面是libc_base + 0x22c968跟libc_base + 0x22cf68两个环境下相差0xa000;所以猜测偏移为0xa000*n,最终爆出来远程跟本地相差0x14000(=0xa000*2)
exp:
1 | #coding:utf-8 |